"""
数据库初始化模块
处理首次启动时的数据库初始化，包括创建默认管理员账户
"""
from motor.motor_asyncio import AsyncIOMotorDatabase
from datetime import datetime
from config.settings import settings
from services.auth import hash_password

async def init_database(db: AsyncIOMotorDatabase):
    """
    初始化数据库
    
    使用一个锁集合（_system_lock）来标记项目是否首次启动
    如果是首次启动，则创建默认的超级管理员账户
    
    Args:
        db: 数据库连接
    """
    # 检查锁集合是否存在
    lock_exists = await db["_system_lock"].find_one({"_id": "initialized"})
    
    if lock_exists:
        print("🔒 数据库已初始化，跳过初始化步骤")
        return
    
    print("🔓 首次启动，开始初始化数据库...")
    
    # 检查是否已存在 admin 用户
    existing_admin = await db.users.find_one({"username": settings.DEFAULT_ADMIN_USERNAME})
    
    if not existing_admin:
        # 创建默认超级管理员账户
        admin_data = {
            "username": settings.DEFAULT_ADMIN_USERNAME,
            "email": settings.DEFAULT_ADMIN_EMAIL,  # 超级管理员允许邮箱为空
            "hashed_password": hash_password(settings.DEFAULT_ADMIN_PASSWORD),
            "role": "admin",
            "disabled": False,
            "created_at": datetime.utcnow(),
            "updated_at": None
        }
        
        result = await db.users.insert_one(admin_data)
        print(f"✅ 创建默认超级管理员成功!")
        print(f"   用户名: {settings.DEFAULT_ADMIN_USERNAME}")
        print(f"   密码: {settings.DEFAULT_ADMIN_PASSWORD}")
        print(f"   ID: {result.inserted_id}")
        print("⚠️  请尽快登录并修改默认密码！")
    else:
        print(f"✅ 超级管理员账户已存在: {existing_admin['username']}")
    
    # 创建锁标记，防止重复初始化
    await db["_system_lock"].insert_one({
        "_id": "initialized",
        "initialized_at": datetime.utcnow(),
        "version": "1.0.0"
    })
    
    print("✅ 数据库初始化完成!")

